Completed
Push — master ( a7453d...2ede20 )
by Sander
01:24
created

contextMenu.js ➔ itemClickCallback   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
c 1
b 0
f 0
nc 3
nop 2
dl 0
loc 14
rs 9.4285
1
/* global API */
2
3
/**
4
 * Nextcloud - passman
5
 *
6
 * @copyright Copyright (c) 2016, Sander Brand ([email protected])
7
 * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel ([email protected])
8
 * @license GNU AGPL version 3 or any later version
9
 *
10
 * This program is free software: you can redistribute it and/or modify
11
 * it under the terms of the GNU Affero General Public License as
12
 * published by the Free Software Foundation, either version 3 of the
13
 * License, or (at your option) any later version.
14
 *
15
 * This program is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 * GNU Affero General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU Affero General Public License
21
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
 *
23
 */
24
25
window.contextMenu = (function () {
26
    'use strict';
27
    function initMenus() {
28
        API.contextMenus.create({
29
            id: 'autoFill:',
30
            title: 'Auto fill',
31
            contexts: ['all']
32
        });
33
34
        API.contextMenus.create({
35
            id: 'copy:User',
36
            title: 'Copy username',
37
            contexts: ['all']
38
        });
39
40
        API.contextMenus.create({
41
            id: 'copy:Pass',
42
            title: 'Copy password',
43
            contexts: ['all']
44
        });
45
46
47
        API.contextMenus.create({
48
            id: 'copy:Url',
49
            title: 'Copy URL',
50
            contexts: ['all']
51
        });
52
       /* API.contextMenus.create({
53
            id: 'copy:OTP',
54
            title: 'Copy OTP',
55
            contexts: ['all']
56
        });*/
57
    }
58
59
    function createMenuItem(parentId, id, label, clickcb) {
60
        API.contextMenus.create({
61
            id: id,
62
            title: label,
63
            contexts: ["all"],
64
            parentId: parentId,
65
            onclick: clickcb
66
        });
67
    }
68
69
    function itemClickCallback(menu_action, login) {
70
        var action = menu_action.menu.split(':', 1)[0];
71
72
        if (action === 'copy') {
73
            copyTextToClipboard(login[menu_action.field]);
74
            return;
75
        }
76
77
        if (action === 'autoFill') {
78
            API.tabs.query({active: true, currentWindow: true}).then(function (tabs) {
79
                API.tabs.sendMessage(tabs[0].id, {method: "enterLoginDetails", args: login});
80
            });
81
        }
82
    }
83
84
    function copyTextToClipboard(text) {
85
        var copyFrom = document.createElement("textarea");
86
        copyFrom.textContent = text;
87
        var body = document.getElementsByTagName('body')[0];
88
        body.appendChild(copyFrom);
89
        copyFrom.select();
90
        document.execCommand('copy');
91
        body.removeChild(copyFrom);
92
    }
93
    API.contextMenus.removeAll();
94
    initMenus();
95
96
    return {
97
        setContextItems: function (logins) {
98
99
            var fields = [
100
                {menu: 'autoFill:', field: 'autoFill'},
101
                {field: 'username', menu: 'copy:User'},
102
                {field: 'password', menu: 'copy:Pass'},
103
                {field: 'url', menu: 'copy:Url'},
104
               // {field: 'totp', menu: 'copy:OTP'}
105
            ];
106
            API.contextMenus.removeAll();
107
            initMenus();
108
109
            for (var i = 0; i < logins.length; i++) {
110
                var login = logins[i];
111
                login.autoFill = true;
112
                for (var f = 0; f < fields.length; f++) {
113
                    var field = fields[f];
114
                    if (field['field'] === 'totp' && login.otp) {
115
                        login.totp = login.otp.secret;
116
                    }
117
                    if (login[field['field']]) {
118
                        createMenuItem(field['menu'], field['menu'] + ':' + login.guid, login.label, (function (field, login) {
119
                            return function () {
120
                                itemClickCallback(field, login);
121
                            };
122
                        })(field, login));
123
                    }
124
                }
125
            }
126
        }
127
    }
128
129
}());